package com.neuedu.thread.sync;

// 模拟一个账户，其中有余额1000元。取钱时如果不足1000元就不能取。
public class Account {
    private int balance = 1000;

    /**
     * synchronized 统一时刻只允许有一个线程访问这个方法
     *
     * qu  方法可以理解为 银行的大门
     */
    // public  synchronized void qu(){
    //     if(balance>=1000){
    //         try {
    //             // 模拟CPU时间片到期，导致的线程切换
    //             Thread.sleep(100); //
    //         } catch (InterruptedException e) {
    //             e.printStackTrace();
    //         }
    //         balance -= 1000;
    //         System.out.println("取了1000元，balance = " + balance);
    //     }
    // }


    public   void qu(){
        System.out.println("取号"+Thread.currentThread().getName());
        System.out.println("做准备");
        synchronized("this"){
            if(balance>=1000){
                try {
                    // 模拟CPU时间片到期，导致的线程切换
                    Thread.sleep(100); //
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                balance -= 1000;
                System.out.println("取了1000元，balance = " + balance);
            }
        }

    }


}

class ThreadTest extends Thread{
    private Account account;
    public ThreadTest(Account account){
        this.account = account;
    }
    public void run(){    
        account.qu();            // 在线程类中调用取钱的方法
    }
}
